﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
//                          ИСПОЛЬЗОВАНИЕ ФОРМЫ                               //
//
// Описание параметров формы см. ПользователиПереопределяемый.ПриОпределенииФормыВыбораПользователей
//

#Область ОписаниеПеременных

&НаКлиенте
Перем ПоследнийЭлемент;

&НаКлиенте
Перем СтрокаПоискаТекст;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды");
		МодульПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
	// Начальное значение настройки до загрузки данных из настроек.
	ВыбиратьИерархически = Истина;
	Элементы.ГруппаКоманднаяПанельВыбора.Видимость = Ложь;
	
	ХранимыеПараметры = ХранимыеПараметры();
	
	Если Параметры.РежимВыбора Тогда
		СтандартныеПодсистемыСервер.УстановитьКлючНазначенияФормы(ЭтотОбъект, "ВыборПодбор");
		РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
		
	ИначеЕсли Пользователи.ЭтоПолноправныйПользователь() Тогда
		// Добавление отбора пользователей, подготовленных ответственным за список.
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
			ПользователиСписок, "Подготовлен", Истина, ,
			НСтр("ru = 'Подготовленные ответственным за список'"), Ложь,
			РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный);
	КонецЕсли;
	
	// Скрытие пользователей с пустым идентификатором, если значение параметра Истина.
	Если Параметры.СкрытьПользователейБезПользователяИБ Тогда
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
			ПользователиСписок,
			"ИдентификаторПользователяИБ",
			ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор(),
			ВидСравненияКомпоновкиДанных.НеРавно);
	КонецЕсли;
	
	// Скрытие служебных пользователей.
	Если Пользователи.ЭтоПолноправныйПользователь() Тогда
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
			ПользователиСписок, "Служебный", Ложь, , , Истина,
			РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный,
			Строка(Новый УникальныйИдентификатор));
	Иначе
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
			ПользователиСписок, "Служебный", Ложь, , , Истина);
	КонецЕсли;
	
	// Скрытие переданного пользователя из формы выбора пользователей.
	Если ТипЗнч(Параметры.СкрываемыеПользователи) = Тип("СписокЗначений") Тогда
		
		ВидСравненияКД = ВидСравненияКомпоновкиДанных.НеВСписке;
		ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
			ПользователиСписок,
			"Ссылка",
			Параметры.СкрываемыеПользователи,
			ВидСравненияКД);
		
	КонецЕсли;
	
	ОформитьИСкрытьНедействительныхПользователей();
	НастроитьПараметрыСпискаПользователейДляКомандыУстановитьПароль();
	НастроитьПорядокГруппыВсеПользователи(ГруппыПользователей);
	
	Элементы.ВыбранныеПользователиИГруппы.Видимость = ХранимыеПараметры.РасширенныйПодбор;
	
	РазделениеВключено = ОбщегоНазначения.РазделениеВключено();
	Если НЕ Пользователи.ЭтоПолноправныйПользователь(, Не РазделениеВключено) Тогда
		Если Элементы.Найти("ПользователиИБ") <> Неопределено Тогда
			Элементы.ПользователиИБ.Видимость = Ложь;
		КонецЕсли;
		Элементы.СведенияОПользователях.Видимость = Ложь;
	КонецЕсли;
	
	Если Параметры.РежимВыбора Тогда
	
		Если Элементы.Найти("ПользователиИБ") <> Неопределено Тогда
			Элементы.ПользователиИБ.Видимость = Ложь;
		КонецЕсли;
		Элементы.СведенияОПользователях.Видимость = Ложь;
		Элементы.ГруппыПользователей.РежимВыбора = ХранимыеПараметры.ВыборГруппПользователей;
		// Отключение перетаскивания пользователя в формах выбора и подбора пользователей.
		Элементы.ПользователиСписок.РазрешитьНачалоПеретаскивания = Ложь;
		
		Если Параметры.Свойство("ИдентификаторыНесуществующихПользователейИБ") Тогда
			ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
				ПользователиСписок, "ИдентификаторПользователяИБ",
				Параметры.ИдентификаторыНесуществующихПользователейИБ,
				ВидСравненияКомпоновкиДанных.ВСписке, , Истина,
				РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный);
		КонецЕсли;
		
		Если Параметры.ЗакрыватьПриВыборе = Ложь Тогда
			// Режим подбора.
			Элементы.ПользователиСписок.МножественныйВыбор = Истина;
			
			Если ХранимыеПараметры.РасширенныйПодбор Тогда
				СтандартныеПодсистемыСервер.УстановитьКлючНазначенияФормы(ЭтотОбъект, "РасширенныйПодбор");
				ИзменитьПараметрыРасширеннойФормыПодбора();
				Элементы.КоманднаяПанель.Видимость = Ложь;
				Элементы.ЗавершитьИЗакрытьВыбор.КнопкаПоУмолчанию = Истина;
				Элементы.ГруппаКоманднаяПанельВыбора.Видимость = Истина;
				Элементы.ПользователиСписок.ПоискПриВводе = ПоискВТаблицеПриВводе.НеИспользовать;
				Элементы.ГруппыПользователей.ПоискПриВводе = ПоискВТаблицеПриВводе.НеИспользовать;
				ТекущийЭлемент = Элементы.СписокВыбранныхПользователейИГрупп;
				Элементы.ЗавершитьИЗакрыть.Заголовок = НСтр("ru='Завершить и закрыть'");
			КонецЕсли;
			
			Если ХранимыеПараметры.ВыборГруппПользователей Тогда
				Элементы.ГруппыПользователей.МножественныйВыбор = Истина;
			КонецЕсли;
		КонецЕсли;
	Иначе
		Элементы.ПользователиСписок.РежимВыбора  = Ложь;
		Элементы.ГруппыПользователей.РежимВыбора = Ложь;
		Элементы.Комментарии.Видимость = Ложь;
		
		ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
			"ВыбратьПользователя", "Видимость", Ложь);
		
		ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
			"ВыбратьГруппуПользователей", "Видимость", Ложь);
	КонецЕсли;
	
	НастроитьФормуПоИспользованиюГруппПользователей();
	ХранимыеПараметры.Удалить("ТекущаяСтрока");
	
	Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов")
	 Или Не Пользователи.ЭтоПолноправныйПользователь()
	 Или ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда
		
		Элементы.ФормаИзменитьВыделенные.Видимость = Ложь;
		Элементы.ПользователиСписокКонтекстноеМенюИзменитьВыделенные.Видимость = Ложь;
	КонецЕсли;
	
	ОписаниеОбъекта = Новый Структура;
	ОписаниеОбъекта.Вставить("Ссылка", Справочники.Пользователи.ПустаяСсылка());
	ОписаниеОбъекта.Вставить("ИдентификаторПользователяИБ", ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор());
	УровеньДоступа = ПользователиСлужебный.УровеньДоступаКСвойствамПользователя(ОписаниеОбъекта);
	
	Если Не УровеньДоступа.УправлениеСписком Тогда
		Элементы.ФормаУстановитьПароль.Видимость = Ложь;
		Элементы.ПользователиСписокКонтекстноеМенюУстановитьПароль.Видимость = Ложь;
	КонецЕсли;
	
	Если ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда
		ТолькоПросмотр = Истина;
		Элементы.ГруппыПользователей.ТолькоПросмотр = Истина;
	КонецЕсли;
	
	Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
		Элементы.ЗавершитьИЗакрыть.Отображение = ОтображениеКнопки.Картинка;
	КонецЕсли;
	
	ВыборУчастниковОбсуждения = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ВыборУчастниковОбсуждения", Ложь);
	
	Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗагрузкаДанныхИзФайла") Тогда
		Элементы.ВставитьИзБуфераОбмена.Видимость = Ложь;
	КонецЕсли; 
	
	АдресПользовательБезФотографии = ПоместитьВоВременноеХранилище(БиблиотекаКартинок.ПользовательБезФотографии, УникальныйИдентификатор);
	АдресФотографии = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
	ЗаполнитьКонтактнуюИнформацию(ЭтотОбъект, Неопределено);
	УстановитьЗаголовокВыбранныхПользователейИГрупп();
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда
		 Элементы.ЗаблокироватьНедействительныхПользователейВСистемеВзаимодействий.Видимость = Истина;
	КонецЕсли;
	
	ПользователиСлужебный.НастроитьПолеНомерКартинкиДинамическогоСписка(ПользователиСписок);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Если Параметры.РежимВыбора Тогда
		ПроверкаИзмененияТекущегоЭлементаФормы();
	КонецЕсли;
	
#Если МобильныйКлиент Тогда
	Если ХранимыеПараметры.ИспользоватьГруппы Тогда
		Элементы.ГруппаГруппы.Заголовок = ?(Элементы.ГруппыПользователей.ТекущиеДанные = Неопределено,
			НСтр("ru = 'Группы пользователей'"),
			Строка(Элементы.ГруппыПользователей.ТекущиеДанные.Ссылка));
	КонецЕсли;
#КонецЕсли
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ВРег(ИмяСобытия) = ВРег("Запись_ГруппыПользователей")
	   И Источник = Элементы.ГруппыПользователей.ТекущаяСтрока
	 Или ВРег(ИмяСобытия) = ВРег("РазмещениеПользователейВГруппах")
	 Или ВРег(ИмяСобытия) = ВРег("Запись_ГруппыДоступа") Тогда
		
		Элементы.ПользователиСписок.Обновить();
		
	ИначеЕсли ВРег(ИмяСобытия) = ВРег("Запись_НаборКонстант") Тогда
		Если ВРег(Источник) = ВРег("ИспользоватьГруппыПользователей") Тогда
			ПодключитьОбработчикОжидания("ПриИзмененииИспользованияГруппПользователей", 0.1, Истина);
		КонецЕсли;
		
	ИначеЕсли ВРег(ИмяСобытия) = ВРег("Запись_Пользователи") Тогда
		ПодключитьОбработчикОжидания("ОбновитьКонтактнуюИнформациюПользователяЗавершение", 0.1, Истина);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПередЗагрузкеДанныхИзНастроекНаСервере(Настройки)
	
	Если ТипЗнч(Настройки["ВыбиратьИерархически"]) = Тип("Булево") Тогда
		ВыбиратьИерархически = Настройки["ВыбиратьИерархически"];
	КонецЕсли;
	
	Если НЕ ВыбиратьИерархически Тогда
		ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ВыбиратьИерархическиПриИзменении(Элемент)
	
	ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПоказыватьНедействительныхПользователейПриИзменении(Элемент)
	ПереключитьОтображениеНедействительныхПользователей(ПоказыватьНедействительныхПользователей);
КонецПроцедуры

&НаКлиенте
Процедура СтрокаПоискаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
	СтрокаПоискаТекст = Текст;
	ПодключитьОбработчикОжидания("СтрокаПоискаЗавершение", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура СтрокаПоискаЗавершение()

	Если НЕ ЗначениеЗаполнено(СтрокаПоискаТекст) Тогда
		Элементы.СтраницыВыбораПользователей.ТекущаяСтраница = Элементы.СтраницаВыборПользователейИГрупп;
	Иначе
		Элементы.СтраницыВыбораПользователей.ТекущаяСтраница = Элементы.СтраницаПоиск;
	КонецЕсли;

	
	Если ХранимыеПараметры.ИспользоватьГруппы Тогда
		ОбновитьЗначениеПараметраКомпоновкиДанных(ПользователиСписок,
			"ВсеПользователи", Истина);
	КонецЕсли;
	
	УстановитьОтборСпискаПользователейПоСтрокеПоиска(СтрокаПоискаТекст);
		
КонецПроцедуры

&НаСервере
Процедура УстановитьОтборСпискаПользователейПоСтрокеПоиска(СтрокаПоискаТекст)

	ОтборПоКонтактнойИнформации = Новый Массив;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		
		Запрос = Новый Запрос;
		Запрос.Текст = 
		"ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	ПользователиКонтактнаяИнформация.Ссылка КАК Ссылка
		|ИЗ
		|	Справочник.Пользователи.КонтактнаяИнформация КАК ПользователиКонтактнаяИнформация
		|ГДЕ
		|	ПользователиКонтактнаяИнформация.Представление ПОДОБНО &СтрокаПоиска СПЕЦСИМВОЛ ""~""";
		
		Запрос.УстановитьПараметр("СтрокаПоиска", ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(СтрокаПоискаТекст) + "%");
		РезультатЗапроса = Запрос.Выполнить();
		ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
		Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
			ОтборПоКонтактнойИнформации.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
		КонецЦикла;
		
	КонецЕсли;
		
	ИспользоватьОтбор = ЗначениеЗаполнено(СтрокаПоискаТекст);
	
	ГруппаОтбора = ОбщегоНазначенияКлиентСервер.СоздатьГруппуЭлементовОтбора(ПользователиСписок.Отбор,
		"ПоискПоСтроке",
		ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли);
		
	ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ГруппаОтбора,
		"Ссылка",
		ВидСравненияКомпоновкиДанных.ВСписке,
		ОтборПоКонтактнойИнформации,,
		ИспользоватьОтбор);
		
	ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ГруппаОтбора,
		"Наименование",
		ВидСравненияКомпоновкиДанных.Содержит,
		СтрокаПоискаТекст,,
		ИспользоватьОтбор);
		
	Элементы.ПользователиСписокПоиск.Обновить();
КонецПроцедуры

&НаКлиенте
Процедура СтрокаПоискаОчистка(Элемент, СтандартнаяОбработка)
	СтрокаПоискаТекст = "";
	Элементы.СтраницыВыбораПользователей.ТекущаяСтраница = Элементы.СтраницаВыборПользователейИГрупп;
	
	ГруппыОтбора = ОбщегоНазначенияКлиентСервер.НайтиЭлементыИГруппыОтбора(ПользователиСписок.Отбор,,
		"ПоискПоСтроке");

	Для каждого ГруппаОтбора Из ГруппыОтбора Цикл
		ГруппаОтбора.Использование = Ложь;
	КонецЦикла;
			
	ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтотОбъект);		
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыГруппыПользователей

&НаКлиенте
Процедура ГруппыПользователейПриИзменении(Элемент)
	
	СписокПриИзмененииНаСервере();
	
КонецПроцедуры

&НаКлиенте
Процедура ГруппыПользователейПриАктивизацииСтроки(Элемент)
	
	ПодключитьОбработчикОжидания("ГруппыПользователейПослеАктивизацииСтроки", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ГруппыПользователейВыборЗначения(Элемент, Значение, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Если Не ХранимыеПараметры.РасширенныйПодбор Тогда
		ОповеститьОВыборе(Значение);
	Иначе
		ПолучитьКартинкиИЗаполнитьСписокВыбранных(Значение);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ГруппыПользователейПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
	
	Если НЕ Копирование Тогда
		Отказ = Истина;
		ПараметрыФормы = Новый Структура;
		
		Если ЗначениеЗаполнено(Элементы.ГруппыПользователей.ТекущаяСтрока) Тогда
			ПараметрыФормы.Вставить(
				"ЗначенияЗаполнения",
				Новый Структура("Родитель", Элементы.ГруппыПользователей.ТекущаяСтрока));
		КонецЕсли;
		
		ОткрытьФорму(
			"Справочник.ГруппыПользователей.ФормаОбъекта",
			ПараметрыФормы,
			Элементы.ГруппыПользователей);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ГруппыПользователейПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	СтандартнаяОбработка = Ложь;
	
	Если ВыбиратьИерархически Тогда
		ПоказатьПредупреждение(,
			НСтр("ru = 'Для перетаскивания пользователя в группы отключите
			           |флажок ""Показывать пользователей нижестоящих групп"".'"));
		Возврат;
	КонецЕсли;
	
	Если Элементы.ГруппыПользователей.ТекущаяСтрока = Строка
		Или Строка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Перемещение Тогда
		Перемещение = Истина;
	Иначе
		Перемещение = Ложь;
	КонецЕсли;
	
	ГруппаПомеченаНаУдаление = Элементы.ГруппыПользователей.ДанныеСтроки(Строка).ПометкаУдаления;
	КоличествоПользователей = ПараметрыПеретаскивания.Значение.Количество();
	ДействиеИсключитьПользователя = (ХранимыеПараметры.ГруппаВсеПользователи = Строка);
	ВключитьВГруппу = (ХранимыеПараметры.ГруппаВсеПользователи = Элементы.ГруппыПользователей.ТекущаяСтрока);
	
	Если КоличествоПользователей = 1 Тогда
		Если ДействиеИсключитьПользователя Тогда
			ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Исключить пользователя ""%1"" из группы ""%2""?'"),
				Строка(ПараметрыПеретаскивания.Значение[0]),
				Строка(Элементы.ГруппыПользователей.ТекущаяСтрока));
			
		ИначеЕсли Не ГруппаПомеченаНаУдаление Тогда
			Если ВключитьВГруппу Тогда
				Шаблон = НСтр("ru = 'Включить пользователя ""%1"" в группу ""%2""?'");
			ИначеЕсли Перемещение Тогда
				Шаблон = НСтр("ru = 'Переместить пользователя ""%1"" в группу ""%2""?'");
			Иначе
				Шаблон = НСтр("ru = 'Скопировать пользователя ""%1"" в группу ""%2""?'");
			КонецЕсли;
			
			ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				Шаблон,
				Строка(ПараметрыПеретаскивания.Значение[0]),
				Строка(Строка));
		Иначе
			Если ВключитьВГруппу Тогда
				Шаблон = НСтр("ru = 'Группа ""%1"" помечена на удаление. Включить пользователя ""%2"" в эту группу?'");
			ИначеЕсли Перемещение Тогда
				Шаблон = НСтр("ru = 'Группа ""%1"" помечена на удаление. Переместить пользователя ""%2"" в эту группу?'");
			Иначе
				Шаблон = НСтр("ru = 'Группа ""%1"" помечена на удаление. Скопировать пользователя ""%2"" в эту группу?'");
			КонецЕсли;
			
			ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				Шаблон,
				Строка(Строка),
				Строка(ПараметрыПеретаскивания.Значение[0]));
			
		КонецЕсли;
	Иначе
		Если ДействиеИсключитьПользователя Тогда
			ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Исключить пользователей (%1) из группы ""%2""?'"),
				КоличествоПользователей,
				Строка(Элементы.ГруппыПользователей.ТекущаяСтрока));
			
		ИначеЕсли Не ГруппаПомеченаНаУдаление Тогда
			Если ВключитьВГруппу Тогда
				Шаблон = НСтр("ru = 'Включить пользователей (%1) в группу ""%2""?'");
			ИначеЕсли Перемещение Тогда
				Шаблон = НСтр("ru = 'Переместить пользователей (%1) в группу ""%2""?'");
			Иначе
				Шаблон = НСтр("ru = 'Скопировать пользователей (%1) в группу ""%2""?'");
			КонецЕсли;
			
			ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				Шаблон,
				КоличествоПользователей,
				Строка(Строка));
		Иначе
			Если ВключитьВГруппу Тогда
				Шаблон = НСтр("ru = 'Группа ""%1"" помечена на удаление. Включить пользователей (%2) в эту группу?'");
			ИначеЕсли Перемещение Тогда
				Шаблон = НСтр("ru = 'Группа ""%1"" помечена на удаление. Переместить пользователей (%2) в эту группу?'");
			Иначе
				Шаблон = НСтр("ru = 'Группа ""%1"" помечена на удаление. Скопировать пользователей (%2) в эту группу?'");
			КонецЕсли;
			
			ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				Шаблон,
				Строка(Строка),
				КоличествоПользователей);
		КонецЕсли;
	КонецЕсли;
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ПараметрыПеретаскивания", ПараметрыПеретаскивания.Значение);
	ДополнительныеПараметры.Вставить("Строка", Строка);
	ДополнительныеПараметры.Вставить("Перемещение", Перемещение);
	
	Оповещение = Новый ОписаниеОповещения("ГруппыПользователейПеретаскиваниеЗавершение", ЭтотОбъект, ДополнительныеПараметры);
	ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Да);
	
КонецПроцедуры

&НаКлиенте
Процедура ГруппыПользователейПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	Если Элементы.ГруппыПользователей.ТолькоПросмотр Тогда
		ПараметрыПеретаскивания.ДопустимыеДействия = ДопустимыеДействияПеретаскивания.НеОбрабатывать;
	Иначе
		СтандартнаяОбработка = Ложь;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыПользователиСписок

&НаКлиенте
Процедура ПользователиСписокПриИзменении(Элемент)
	
	СписокПриИзмененииНаСервере();
	
КонецПроцедуры

&НаКлиенте
Процедура ПользователиСписокПриАктивизацииСтроки(Элемент)
	
	Если СтандартныеПодсистемыКлиент.ЭтоЭлементДинамическогоСписка(Элементы.ПользователиСписок) Тогда
		ВозможноСменитьПароль = Элементы.ПользователиСписок.ТекущиеДанные.ВозможноСменитьПароль;
	Иначе
		ВозможноСменитьПароль = Ложь;
	КонецЕсли;
	
	Элементы.ФормаУстановитьПароль.Доступность = ВозможноСменитьПароль;
	Элементы.ПользователиСписокКонтекстноеМенюУстановитьПароль.Доступность = ВозможноСменитьПароль;
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	Если НЕ ХранимыеПараметры.РасширенныйПодбор Тогда
	
		Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
			МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
			МодульПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
		КонецЕсли;
	
	КонецЕсли;
	
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
	ОбновитьКонтактнуюИнформациюПользователя(Элемент);
	
КонецПроцедуры

&НаКлиенте
Процедура ПользователиСписокВыборЗначения(Элемент, Значение, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Если Не ХранимыеПараметры.РасширенныйПодбор Тогда
		ОповеститьОВыборе(Значение);
	Иначе
		ПолучитьКартинкиИЗаполнитьСписокВыбранных(Значение);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПользователиСписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
	
	Отказ = Истина;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ГруппаНовогоПользователя", Элементы.ГруппыПользователей.ТекущаяСтрока);
	
	Если Копирование И Элемент.ТекущиеДанные <> Неопределено Тогда
		ПараметрыФормы.Вставить("ЗначениеКопирования", Элемент.ТекущаяСтрока);
	КонецЕсли;
	
	ОткрытьФорму("Справочник.Пользователи.ФормаОбъекта", ПараметрыФормы, Элементы.ПользователиСписок);
	
КонецПроцедуры

&НаКлиенте
Процедура ПользователиСписокПередНачаломИзменения(Элемент, Отказ)
	
	Отказ = Истина;
	
	Если Не ЗначениеЗаполнено(Элемент.ТекущаяСтрока) Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыФормы = Новый Структура("Ключ", Элемент.ТекущаяСтрока);
	ОткрытьФорму("Справочник.Пользователи.ФормаОбъекта", ПараметрыФормы, Элемент);
	
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПользователиСписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
	
	ПользователиСлужебный.ДинамическийСписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки);
	
КонецПроцедуры

&НаКлиенте
Процедура ПользователиСписокПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСписокВыбранныхПользователейИГрупп

&НаКлиенте
Процедура СписокВыбранныхПользователейИГруппВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	УдалитьИзСпискаВыбранных();
	СписокВыбранныхПользователейИзменен = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокВыбранныхПользователейИГруппПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	
	Если НоваяСтрока И Не Копирование Тогда
		Элемент.ТекущиеДанные.Пользователь = ПредопределенноеЗначение("Справочник.Пользователи.ПустаяСсылка");
		Элемент.ТекущиеДанные.НомерКартинки = 1;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокВыбранныхПользователейИГруппПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	
	СписокВыбранныхПользователейИзменен = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокВыбранныхПользователейИГруппПриАктивизацииСтроки(Элемент)
	
	ОбновитьКонтактнуюИнформациюПользователя(Элемент);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыПользователиСписокПоиск

&НаКлиенте
Процедура ПользователиСписокПоискПриАктивизацииСтроки(Элемент)
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
		МодульПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
	ОбновитьКонтактнуюИнформациюПользователя(Элемент);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура СоздатьГруппуПользователей(Команда)
	
	Элементы.ГруппыПользователей.ДобавитьСтроку();
	
КонецПроцедуры

&НаКлиенте
Процедура НазначитьГруппы(Команда)
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Пользователи", Элементы.ПользователиСписок.ВыделенныеСтроки);
	ПараметрыФормы.Вставить("ВнешниеПользователи", Ложь);
	
	ОткрытьФорму("ОбщаяФорма.ГруппыПользователей", ПараметрыФормы);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьПароль(Команда)
	
	ТекущиеДанные = Элементы.ПользователиСписок.ТекущиеДанные;
	
	Если СтандартныеПодсистемыКлиент.ЭтоЭлементДинамическогоСписка(ТекущиеДанные) Тогда
		ПользователиСлужебныйКлиент.ОткрытьФормуСменыПароля(ТекущиеДанные.Ссылка);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьИЗакрыть(Команда)
	
	Если ХранимыеПараметры.РасширенныйПодбор Тогда
		МассивПользователей = РезультатВыбора();
		ОповеститьОВыборе(МассивПользователей);
		СписокВыбранныхПользователейИзменен = Ложь;
		Закрыть(МассивПользователей);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьПользователяКоманда(Команда)
	
	Если Элементы.СтраницыВыбораПользователей.ТекущаяСтраница = Элементы.СтраницаПоиск Тогда
		МассивПользователей = Элементы.ПользователиСписокПоиск.ВыделенныеСтроки;
	Иначе	
		МассивПользователей = Элементы.ПользователиСписок.ВыделенныеСтроки;
	КонецЕсли;
	
	ПолучитьКартинкиИЗаполнитьСписокВыбранных(МассивПользователей);
	
КонецПроцедуры

&НаКлиенте
Процедура ОтменитьВыборПользователяИлиГруппы(Команда)
	
	УдалитьИзСпискаВыбранных();
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьСписокВыбранныхПользователейИГрупп(Команда)
	
	УдалитьИзСпискаВыбранных(Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьГруппу(Команда)
	
	МассивГрупп = Элементы.ГруппыПользователей.ВыделенныеСтроки;
	ПолучитьКартинкиИЗаполнитьСписокВыбранных(МассивГрупп);
	
КонецПроцедуры

&НаКлиенте
Процедура СведенияОПользователях(Команда)
	
	ОткрытьФорму(
		"Отчет.СведенияОПользователях.ФормаОбъекта",
		Новый Структура("КлючВарианта", "СведенияОПользователях"),
		ЭтотОбъект,
		"СведенияОПользователях");
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Поддержка группового изменения объектов.

&НаКлиенте
Процедура ИзменитьВыделенные(Команда)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") Тогда
		МодульГрупповоеИзменениеОбъектовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ГрупповоеИзменениеОбъектовКлиент");
		МодульГрупповоеИзменениеОбъектовКлиент.ИзменитьВыделенные(Элементы.ПользователиСписок, ПользователиСписок);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВставитьИзБуфераОбмена(Команда)
	ПараметрыПоиска = Новый Структура;
	ПараметрыПоиска.Вставить("ОписаниеТипов", Новый ОписаниеТипов("СправочникСсылка.Пользователи"));
	ПараметрыПоиска.Вставить("ПараметрыВыбора", Новый СписокЗначений);
	ПараметрыПоиска.Вставить("ПредставлениеПоля", Заголовок);
	ПараметрыПоиска.Вставить("Сценарий", "ПоискСсылок");
	
	ПараметрыВыполнения = Новый Структура;
	Обработчик = Новый ОписаниеОповещения("ВставитьИзБуфераОбменаЗавершение", ЭтотОбъект, ПараметрыВыполнения);
	
	МодульЗагрузкаДанныхИзФайлаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЗагрузкаДанныхИзФайлаКлиент");
	МодульЗагрузкаДанныхИзФайлаКлиент.ПоказатьФормуЗаполненияСсылок(ПараметрыПоиска, Обработчик);
КонецПроцедуры

&НаКлиенте
Процедура ВставитьИзБуфераОбменаЗавершение(НайденныеОбъекты, ПараметрыВыполнения) Экспорт
	
	Если НайденныеОбъекты = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ВставитьИзБуфераОбменаЗавершениеСервер(НайденныеОбъекты);
	
КонецПроцедуры

&НаСервере
Процедура ВставитьИзБуфераОбменаЗавершениеСервер(НайденныеОбъекты)

	Для Каждого Значение Из НайденныеОбъекты Цикл
		ВыбранныеПользователиИГруппы.Добавить().Пользователь = Значение;
	КонецЦикла;
	Пользователи.ЗаполнитьНомераКартинокПользователей(ВыбранныеПользователиИГруппы, "Пользователь", "НомерКартинки");

КонецПроцедуры

&НаКлиенте
Процедура Выбрать(Команда)
	Если Элементы.СтраницыВыбораПользователей.ТекущаяСтраница = Элементы.СтраницаВыборПользователейИГрупп Тогда
	    ПользователиСписокВыборЗначения(Элементы.ПользователиСписок,
			ВыбранныеЗначенияСписка(Элементы.ПользователиСписок),
			Ложь);
	Иначе	
		ПользователиСписокВыборЗначения(Элементы.ПользователиСписокПоиск,
			ВыбранныеЗначенияСписка(Элементы.ПользователиСписокПоиск),
			Ложь);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗаблокироватьНедействительныхПользователейВСистемеВзаимодействий(Команда)
	РезультатОбработки = ЗаблокироватьНедействительныхПользователейВСистемеВзаимодействийНаСервере();
	Если Не ПустаяСтрока(РезультатОбработки) Тогда
		ШаблонСообщения = НСтр("ru='Не удалось заблокировать пользователей по причине:
			|
			|%1'");
		ПоказатьПредупреждение(,
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, РезультатОбработки),,
			НСтр("ru='Не удалось заблокировать пользователей'"));
	Иначе
		Состояние(НСтр("ru='Блокировка недействительных пользователей
			|выполнена.'"),,,БиблиотекаКартинок.Успешно32);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ЗаблокироватьНедействительныхПользователейВСистемеВзаимодействийНаСервере()
	Результат = "";
	МодульОбсужденияСлужебный = ОбщегоНазначения.ОбщийМодуль("ОбсужденияСлужебный");
	НедействительныеПользователи = МодульОбсужденияСлужебный.НедействительныеПользователи();
	Для каждого НедействительныйПользователь Из НедействительныеПользователи Цикл
		РезультатБлокировки = МодульОбсужденияСлужебный.ЗаблокироватьПользователяСистемыВзаимодействия(НедействительныйПользователь);
		Если РезультатБлокировки <> Неопределено Тогда
			Результат = ОбработкаОшибок.КраткоеПредставлениеОшибки(РезультатБлокировки);
			ЗаписьЖурналаРегистрации(НСтр("ru='Обсуждения.Блокировка недействительных пользователей'", ОбщегоНазначения.КодОсновногоЯзыка()),
				УровеньЖурналаРегистрации.Ошибка,,,
				ОбработкаОшибок.ПодробноеПредставлениеОшибки(РезультатБлокировки));
		КонецЕсли;
	КонецЦикла;
	Возврат Результат;
КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиенте
Функция ВыбранныеЗначенияСписка(Элемент)
	Результат = Новый Массив;
	
	ВыбранныеСтроки = ОбщегоНазначенияКлиентСервер.ЗначениеСвойстваЭлементаФормы(Элементы, Элемент.Имя, "ВыделенныеСтроки");
	Если ВыбранныеСтроки <> Неопределено Тогда
	
		Для каждого ИдентификаторСтроки Из ВыбранныеСтроки Цикл
			Результат.Добавить(Элемент.ДанныеСтроки(ИдентификаторСтроки).Ссылка);
		КонецЦикла;
	
	КонецЕсли;
	
	Возврат Результат;
КонецФункции

&НаКлиенте
Процедура ОбновитьКонтактнуюИнформациюПользователя(ЭлементСписок)
	
	ТекущиеДанные = ЭлементСписок.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		ЗаполнитьКонтактнуюИнформацию(ЭтотОбъект, Неопределено);
		Возврат;
	КонецЕсли;
	
	Если ЭлементСписок = Элементы.СписокВыбранныхПользователейИГрупп Тогда
		ТекущийПользователь = ТекущиеДанные.Пользователь;
	ИначеЕсли НЕ СтандартныеПодсистемыКлиент.ЭтоЭлементДинамическогоСписка(ЭлементСписок) Тогда
		ЗаполнитьКонтактнуюИнформацию(ЭтотОбъект, Неопределено);
		Возврат;
	Иначе
		ТекущийПользователь = ТекущиеДанные.Ссылка;
	КонецЕсли;
	
	ПодключитьОбработчикОжидания("ОбновитьКонтактнуюИнформациюПользователяЗавершение", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьКонтактнуюИнформациюПользователяЗавершение()
	ЗаполнитьКонтактнуюИнформацию(ЭтотОбъект, ТекущийПользователь);
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ЗаполнитьКонтактнуюИнформацию(Форма, ТекущийПользователь)
	Если НЕ ЗначениеЗаполнено(ТекущийПользователь) Тогда
		Форма.ПредставлениеКонтактнойИнформации = "";
		Форма.АдресФотографии = Форма.АдресПользовательБезФотографии;
		Возврат;
	КонецЕсли;
	
	КонтактнаяИнформацияПользователя = ?(ЗначениеЗаполнено(ТекущийПользователь),
		КонтактнаяИнформацияПользователя(ТекущийПользователь, Форма.АдресПользовательБезФотографии, Форма.УникальныйИдентификатор),
		Новый Структура);
	Форма.АдресФотографии = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(
		КонтактнаяИнформацияПользователя,
		"Фотография",
		Форма.АдресПользовательБезФотографии);
	
	Шаблон = НСтр("ru='%1
	|
	|Телефон: %2
	|Электронная почта: %3'");
	
	Подразделение = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(КонтактнаяИнформацияПользователя, "Подразделение", "");
	ИмяПользователя = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(КонтактнаяИнформацияПользователя, "Наименование", "");
	ПредставлениеПользователя = ?(ЗначениеЗаполнено(ИмяПользователя), ИмяПользователя,"")
		+ ?(ЗначениеЗаполнено(Подразделение), Символы.ПС + Подразделение, "");
		
	Форма.ПредставлениеКонтактнойИнформации = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон,
		ПредставлениеПользователя,
		ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(КонтактнаяИнформацияПользователя, "Телефон", ""),
		ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(КонтактнаяИнформацияПользователя, "АдресЭлектроннойПочты", ""));
КонецПроцедуры

&НаСервереБезКонтекста
Функция КонтактнаяИнформацияПользователя(Пользователь, АдресФотографииПоУмолчанию, УникальныйИдентификатор)
	КонтактнаяИнформация = ПользователиСлужебный.ОписаниеПользователя(Пользователь);
	Если КонтактнаяИнформация.Фотография <> Неопределено Тогда
		КонтактнаяИнформация.Фотография = ПоместитьВоВременноеХранилище(КонтактнаяИнформация.Фотография, УникальныйИдентификатор);
	Иначе
		КонтактнаяИнформация.Фотография = АдресФотографииПоУмолчанию;
	КонецЕсли;
	
	Возврат КонтактнаяИнформация;
КонецФункции

// Возвращаемое значение:
//  Структура:
//   * ВыборГруппПользователей - Булево
//   * РасширенныйПодбор - Булево
//   * ИспользоватьГруппы - Произвольный
//   * ГруппаВсеПользователи - СправочникСсылка.ГруппыПользователей
//   * ТекущаяСтрока - СправочникСсылка, Неопределено
//   * ЗаголовокФормыПодбора - Строка
//   * ЗаголовокКнопкиЗавершенияПодбора - Строка
//
&НаСервере
Функция ХранимыеПараметры()
	
	Результат = Новый Структура;
	Результат.Вставить("ВыборГруппПользователей", Параметры.ВыборГруппПользователей);
	Результат.Вставить("РасширенныйПодбор", Параметры.РасширенныйПодбор);
	Результат.Вставить("ИспользоватьГруппы", ПолучитьФункциональнуюОпцию("ИспользоватьГруппыПользователей"));
	Результат.Вставить("ГруппаВсеПользователи", Справочники.ГруппыПользователей.ВсеПользователи);
	Результат.Вставить("ТекущаяСтрока", Параметры.ТекущаяСтрока);
	Результат.Вставить("ЗаголовокФормыПодбора", "");
	Результат.Вставить("ЗаголовокКнопкиЗавершенияПодбора", "");
	Возврат Результат;
	
КонецФункции

&НаСервере
Процедура ОформитьИСкрытьНедействительныхПользователей()
	
	ЭлементОформления = ПользователиСписок.КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Добавить();
	ЭлементОформления.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	
	ЭлементЦветаОформления = ЭлементОформления.Оформление.Элементы.Найти("TextColor");
	ЭлементЦветаОформления.Значение = Метаданные.ЭлементыСтиля.ТекстЗапрещеннойЯчейкиЦвет.Значение;
	ЭлементЦветаОформления.Использование = Истина;
	
	ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Недействителен");
	ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Истина;
	ЭлементОтбора.Использование  = Истина;
	
	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
		ПользователиСписок, "Недействителен", Ложь, , , Истина);
	
КонецПроцедуры

&НаСервере
Процедура НастроитьПорядокГруппыВсеПользователи(Список)
	
	Перем Порядок;
	
	// Порядок.
	Порядок = Список.КомпоновщикНастроек.Настройки.Порядок;
	Порядок.ИдентификаторПользовательскойНастройки = "ОсновнойПорядок";
	
	Порядок.Элементы.Очистить();
	
	ЭлементПорядка = Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
	ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("Предопределенный");
	ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв;
	ЭлементПорядка.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	
	ЭлементПорядка = Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
	ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("Наименование");
	ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр;
	ЭлементПорядка.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	
КонецПроцедуры

&НаСервере
Процедура НастроитьПараметрыСпискаПользователейДляКомандыУстановитьПароль()
	
	ОбновитьЗначениеПараметраКомпоновкиДанных(ПользователиСписок, "ИдентификаторТекущегоПользователяИБ",
		ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор);
	
	ОбновитьЗначениеПараметраКомпоновкиДанных(ПользователиСписок, "ПустойУникальныйИдентификатор",
		ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор());
	
	ОбновитьЗначениеПараметраКомпоновкиДанных(ПользователиСписок, "ВозможноСменитьТолькоСвойПароль",
		Не Пользователи.ЭтоПолноправныйПользователь());
	
КонецПроцедуры

&НаКлиенте
Процедура ПроверкаИзмененияТекущегоЭлементаФормы()
	
	Если ТекущийЭлемент <> ПоследнийЭлемент Тогда
		ПриИзмененииТекущегоЭлементаФормы();
		ПоследнийЭлемент = ТекущийЭлемент;
	КонецЕсли;
	
#Если ВебКлиент Тогда
	ПодключитьОбработчикОжидания("ПроверкаИзмененияТекущегоЭлементаФормы", 0.7, Истина);
#Иначе
	ПодключитьОбработчикОжидания("ПроверкаИзмененияТекущегоЭлементаФормы", 0.1, Истина);
#КонецЕсли
	
КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененииТекущегоЭлементаФормы()
	
	Если ТекущийЭлемент = Элементы.ГруппыПользователей Тогда
		Элементы.Комментарии.ТекущаяСтраница = Элементы.КомментарийГруппы;
		
	ИначеЕсли ТекущийЭлемент = Элементы.ПользователиСписок Тогда
		Элементы.Комментарии.ТекущаяСтраница = Элементы.КомментарийПользователя;
		
	КонецЕсли
	
КонецПроцедуры

&НаСервере
Процедура УдалитьИзСпискаВыбранных(УдалитьВсех = Ложь)
	
	Если УдалитьВсех Тогда
		ВыбранныеПользователиИГруппы.Очистить();
		Возврат;
	КонецЕсли;
	
	МассивЭлементовСписка = Элементы.СписокВыбранныхПользователейИГрупп.ВыделенныеСтроки;
	Для Каждого ЭлементСписка Из МассивЭлементовСписка Цикл
		ВыбранныеПользователиИГруппы.Удалить(ВыбранныеПользователиИГруппы.НайтиПоИдентификатору(ЭлементСписка));
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ПолучитьКартинкиИЗаполнитьСписокВыбранных(МассивВыбранныхЭлементов)
	
	ВыбранныеЭлементыИКартинки = Новый Массив;
	Для Каждого ВыбранныйЭлемент Из МассивВыбранныхЭлементов Цикл
		
		Если ТипЗнч(ВыбранныйЭлемент) = Тип("СправочникСсылка.Пользователи") Тогда
			НомерКартинки = Элементы.ПользователиСписок.ДанныеСтроки(ВыбранныйЭлемент).НомерКартинки;
		Иначе
			НомерКартинки = Элементы.ГруппыПользователей.ДанныеСтроки(ВыбранныйЭлемент).НомерКартинки;
		КонецЕсли;
		
		ВыбранныеЭлементыИКартинки.Добавить(
			Новый Структура("ВыбранныйЭлемент, НомерКартинки", ВыбранныйЭлемент, НомерКартинки));
	КонецЦикла;
	
	ЗаполнитьСписокВыбранныхПользователейИГрупп(ВыбранныеЭлементыИКартинки);
	
КонецПроцедуры

&НаСервере
Функция РезультатВыбора()
	МассивПользователей = Новый Массив;
	
	ВыбранныеПользователиТаблицаЗначений = ВыбранныеПользователиИГруппы.Выгрузить( , "Пользователь");
	Если ВыборУчастниковОбсуждения И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда
		МодульОбсуждения = ОбщегоНазначения.ОбщийМодуль("Обсуждения");
		ИдентификаторыУчастников = МодульОбсуждения.ПользователиСистемыВзаимодействия(ВыбранныеПользователиТаблицаЗначений.ВыгрузитьКолонку("Пользователь"));
		Для каждого ПользовательИдентификатор Из ИдентификаторыУчастников Цикл
		
			Если ПользовательИдентификатор.Значение <> Неопределено Тогда
				МассивПользователей.Добавить(ПользовательИдентификатор.Значение.Идентификатор);
			КонецЕсли;
		
		КонецЦикла;
	Иначе
		МассивПользователей = ВыбранныеПользователиТаблицаЗначений.ВыгрузитьКолонку("Пользователь");
	КонецЕсли;
	
	Возврат МассивПользователей;
КонецФункции

&НаСервере
Процедура ИзменитьПараметрыРасширеннойФормыПодбора()
	
	// Загрузка списка выбранных пользователей.
	Если ЗначениеЗаполнено(Параметры.ПараметрыРасширеннойФормыПодбора) Тогда
		ПараметрыРасширеннойФормыПодбора = ПолучитьИзВременногоХранилища(Параметры.ПараметрыРасширеннойФормыПодбора);
	Иначе
		ПараметрыРасширеннойФормыПодбора = Параметры;
	КонецЕсли;
	Если ТипЗнч(ПараметрыРасширеннойФормыПодбора.ВыбранныеПользователи) = Тип("ТаблицаЗначений") Тогда
		ВыбранныеПользователиИГруппы.Загрузить(ПараметрыРасширеннойФормыПодбора.ВыбранныеПользователи);
	Иначе
		Для Каждого ВыбранныйПользователь Из ПараметрыРасширеннойФормыПодбора.ВыбранныеПользователи Цикл
			ВыбранныеПользователиИГруппы.Добавить().Пользователь = ВыбранныйПользователь;
		КонецЦикла;
	КонецЕсли;
	Пользователи.ЗаполнитьНомераКартинокПользователей(ВыбранныеПользователиИГруппы, "Пользователь", "НомерКартинки");
	ХранимыеПараметры.ЗаголовокФормыПодбора = ПараметрыРасширеннойФормыПодбора.ЗаголовокФормыПодбора;
	
	Если ПараметрыРасширеннойФормыПодбора.Свойство("ЗаголовокКнопкиЗавершенияПодбора") Тогда 
		ХранимыеПараметры.ЗаголовокКнопкиЗавершенияПодбора = ПараметрыРасширеннойФормыПодбора.ЗаголовокКнопкиЗавершенияПодбора;
	КонецЕсли;
	
	// Установка параметров расширенной формы подбора.
	Элементы.ЗавершитьИЗакрыть.Видимость         = Истина;
	Элементы.ГруппаВыбратьПользователя.Видимость = Истина;
	// Включение видимости списка выбранных пользователей.
	Элементы.ВыбранныеПользователиИГруппы.Видимость     = Истина;
	
	Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
		Элементы.ГруппыИПользователи.Группировка                 = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
		Элементы.ГруппыИПользователи.ВажностьПриОтображении      = ВажностьПриОтображении.ОченьВысокая;
		Элементы.ГруппаСодержимое.Группировка                    = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
		Элементы.ГруппаВыбратьГруппу.Видимость                   = Ложь;
		Элементы.ГруппаВыбратьПользователя.Видимость             = Ложь;
		Элементы.Переместить(Элементы.ВыбранныеПользователиИГруппы, Элементы.ГруппаСодержимое, Элементы.ВыбранныеПользователиИГруппы);
	ИначеЕсли ПолучитьФункциональнуюОпцию("ИспользоватьГруппыПользователей") Тогда
		Элементы.ГруппыИПользователи.Группировка                 = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
		Элементы.ПользователиСписок.Высота                       = 5;
		Элементы.ГруппыПользователей.Высота                      = 3;
		Высота                                        = 17;
		Элементы.ГруппаВыбратьГруппу.Видимость                   = Истина;
		// Включение отображения заголовков списков ПользователиСписок и ГруппыПользователей.
		Элементы.ГруппыПользователей.ПоложениеЗаголовка          = ПоложениеЗаголовкаЭлементаФормы.Верх;
		Элементы.ПользователиСписок.ПоложениеЗаголовка           = ПоложениеЗаголовкаЭлементаФормы.Верх;
		Элементы.ПользователиСписок.Заголовок                    = НСтр("ru = 'Пользователи в группе'");
		Если ПараметрыРасширеннойФормыПодбора.Свойство("ПодборГруппНевозможен") Тогда
			Элементы.ВыбратьГруппу.Видимость                     = Ложь;
		КонецЕсли;
	Иначе
		Элементы.ОтменитьВыборПользователя.Видимость             = Истина;
		Элементы.ОчиститьСписокВыбранных.Видимость               = Истина;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура УстановитьЗаголовокВыбранныхПользователейИГрупп()
	
	Если ХранимыеПараметры.ИспользоватьГруппы Тогда
		Элементы.СписокВыбранныхПользователейИГрупп.Заголовок = НСтр("ru = 'Выбранные пользователи и группы'");
	Иначе
		Элементы.СписокВыбранныхПользователейИГрупп.Заголовок = НСтр("ru = 'Выбранные пользователи'");
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСписокВыбранныхПользователейИГрупп(ВыбранныеЭлементыИКартинки)
	
	ПользователиСлужебный.ВыбратьПользователейГруппы(
		ВыбранныеЭлементыИКартинки, ХранимыеПараметры, Элементы.ПользователиСписок);
	
	Для Каждого СтрокаМассива Из ВыбранныеЭлементыИКартинки Цикл
		
		ВыбранныйПользовательИлиГруппа = СтрокаМассива.ВыбранныйЭлемент;
		НомерКартинки = СтрокаМассива.НомерКартинки;
		
		ПараметрыОтбора = Новый Структура("Пользователь", ВыбранныйПользовательИлиГруппа);
		Найденный = ВыбранныеПользователиИГруппы.НайтиСтроки(ПараметрыОтбора);
		Если Найденный.Количество() = 0 Тогда
			
			СтрокаВыбранныеПользователи = ВыбранныеПользователиИГруппы.Добавить();
			СтрокаВыбранныеПользователи.Пользователь = ВыбранныйПользовательИлиГруппа;
			СтрокаВыбранныеПользователи.НомерКартинки = НомерКартинки;
			СписокВыбранныхПользователейИзменен = Истина;
			
		КонецЕсли;
		
	КонецЦикла;
	
	ВыбранныеПользователиИГруппы.Сортировать("Пользователь Возр");
	
КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененииИспользованияГруппПользователей()
	
	НастроитьФормуПоИспользованиюГруппПользователей(Истина);
	
КонецПроцедуры

&НаСервере
Процедура НастроитьФормуПоИспользованиюГруппПользователей(ИзменилосьИспользованиеГрупп = Ложь)
	
	Если ИзменилосьИспользованиеГрупп Тогда
		ХранимыеПараметры.ИспользоватьГруппы = ПолучитьФункциональнуюОпцию("ИспользоватьГруппыПользователей");
	КонецЕсли;
	
	ТекущиеХранимыеПараметры = ХранимыеПараметры; // см. ХранимыеПараметры
	Если ТекущиеХранимыеПараметры.Свойство("ТекущаяСтрока") Тогда
		
		Если ТипЗнч(ТекущиеХранимыеПараметры.ТекущаяСтрока) = Тип("СправочникСсылка.ГруппыПользователей") Тогда
			
			Если ХранимыеПараметры.ИспользоватьГруппы Тогда
				Элементы.ГруппыПользователей.ТекущаяСтрока = ТекущиеХранимыеПараметры.ТекущаяСтрока;
			Иначе
				Параметры.ТекущаяСтрока = Неопределено;
			КонецЕсли;
		ИначеЕсли Не ХранимыеПараметры.РасширенныйПодбор
		     Или ТипЗнч(ТекущиеХранимыеПараметры.ТекущаяСтрока) = Тип("СправочникСсылка.Пользователи") Тогда
			
			ТекущийЭлемент = Элементы.ПользователиСписок;
			Элементы.ГруппыПользователей.ТекущаяСтрока = Справочники.ГруппыПользователей.ВсеПользователи;
		КонецЕсли;
	Иначе
		Если НЕ ХранимыеПараметры.ИспользоватьГруппы
		   И Элементы.ГруппыПользователей.ТекущаяСтрока
		     <> Справочники.ГруппыПользователей.ВсеПользователи Тогда
			
			Элементы.ГруппыПользователей.ТекущаяСтрока = Справочники.ГруппыПользователей.ВсеПользователи;
		КонецЕсли;
	КонецЕсли;
	
	Элементы.ВыбиратьИерархически.Видимость = ХранимыеПараметры.ИспользоватьГруппы;
	
	Если Не ПравоДоступа("Редактирование", Метаданные.Справочники.ГруппыПользователей)
	 Или ХранимыеПараметры.РасширенныйПодбор
	 Или ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда
		
		Элементы.НазначитьГруппы.Видимость = Ложь;
		Элементы.ПользователиСписокКонтекстноеМенюНазначитьГруппы.Видимость = Ложь;
	Иначе
		Элементы.НазначитьГруппы.Видимость = ХранимыеПараметры.ИспользоватьГруппы;
		Элементы.ПользователиСписокКонтекстноеМенюНазначитьГруппы.Видимость =
			ХранимыеПараметры.ИспользоватьГруппы;
	КонецЕсли;
	
	Элементы.СоздатьГруппуПользователей.Видимость =
		ПравоДоступа("Добавление", Метаданные.Справочники.ГруппыПользователей)
		И ХранимыеПараметры.ИспользоватьГруппы
		И Не ОбщегоНазначения.ЭтоАвтономноеРабочееМесто();
	
	ВыборГруппПользователей = ХранимыеПараметры.ВыборГруппПользователей
	                        И ХранимыеПараметры.ИспользоватьГруппы
	                        И Параметры.РежимВыбора;
	
	Если Параметры.РежимВыбора Тогда
		
		ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
			"ВыбратьГруппуПользователей", "Видимость", ?(ХранимыеПараметры.РасширенныйПодбор,
				Ложь, ВыборГруппПользователей));
		
		ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
			"ВыбратьПользователя", "КнопкаПоУмолчанию", ?(ХранимыеПараметры.РасширенныйПодбор,
				Ложь, Не ВыборГруппПользователей));
		
		ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
			"ВыбратьПользователя", "Видимость", Не ХранимыеПараметры.РасширенныйПодбор);
		
		АвтоЗаголовок = Ложь;
		
		Если Параметры.ЗакрыватьПриВыборе = Ложь Тогда
			// Режим подбора.
			
			Если ВыборГруппПользователей Тогда
				
				Если ХранимыеПараметры.РасширенныйПодбор Тогда
					Заголовок = ХранимыеПараметры.ЗаголовокФормыПодбора;
				Иначе
					Заголовок = НСтр("ru = 'Подбор пользователей и групп'");
				КонецЕсли;
				
				ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
					"ВыбратьПользователя", "Заголовок", НСтр("ru = 'Выбрать пользователей'"));
				
				ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
					"ВыбратьГруппуПользователей", "Заголовок", НСтр("ru = 'Выбрать группы'"));
			Иначе
				
				Если ХранимыеПараметры.РасширенныйПодбор Тогда
					Заголовок = ХранимыеПараметры.ЗаголовокФормыПодбора;
					
					Если Не ПустаяСтрока(ХранимыеПараметры.ЗаголовокКнопкиЗавершенияПодбора) Тогда
						ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
							"ЗавершитьИЗакрытьВыбор", "Заголовок", ХранимыеПараметры.ЗаголовокКнопкиЗавершенияПодбора);
					КонецЕсли;
					
				Иначе
					Заголовок = НСтр("ru = 'Подбор пользователей'");
				КонецЕсли;
				
			КонецЕсли;
			
		Иначе
			// Режим выбора.
			Если ВыборГруппПользователей Тогда
				Заголовок = НСтр("ru = 'Выбор пользователя или группы'");
				
				ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
					"ВыбратьПользователя", "Заголовок", НСтр("ru = 'Выбрать пользователя'"));
			Иначе
				Заголовок = НСтр("ru = 'Выбор пользователя'");
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтотОбъект);
	
	// Принудительное обновление видимости после изменения функциональной
	// опции без использования команды ОбновитьИнтерфейс.
	Элементы.ГруппыПользователей.Видимость = Ложь;
	Элементы.ГруппыПользователей.Видимость = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ГруппыПользователейПослеАктивизацииСтроки()
	
	ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтотОбъект);
	
	Если Элементы.ПользователиСписок.ТекущиеДанные = Неопределено Тогда
		ТекущийПользователь = Неопределено;
		ЗаполнитьКонтактнуюИнформацию(ЭтотОбъект, Неопределено);
	КонецЕсли;
	
#Если МобильныйКлиент Тогда
	Если Не ХранимыеПараметры.РасширенныйПодбор Тогда
		Элементы.ГруппаГруппы.Заголовок = ?(Элементы.ГруппыПользователей.ТекущиеДанные = Неопределено,
			НСтр("ru = 'Группы пользователей'"),
			Строка(Элементы.ГруппыПользователей.ТекущиеДанные.Ссылка));
		ТекущийЭлемент = Элементы.ПользователиСписок;
	КонецЕсли;
#КонецЕсли

КонецПроцедуры

&НаСервере
Функция ПеремещениеПользователяВНовуюГруппу(МассивПользователей, НоваяГруппаВладелец, Перемещение)
	
	Если НоваяГруппаВладелец = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ТекущаяГруппаВладелец = Элементы.ГруппыПользователей.ТекущаяСтрока;
	СообщениеПользователю = ПользователиСлужебный.ПеремещениеПользователяВНовуюГруппу(
		МассивПользователей, ТекущаяГруппаВладелец, НоваяГруппаВладелец, Перемещение);
	
	Элементы.ПользователиСписок.Обновить();
	Элементы.ГруппыПользователей.Обновить();
	
	Возврат СообщениеПользователю;
	
КонецФункции

// Обработчик вопроса.
//
// Параметры:
//  Ответ - КодВозвратаДиалога
//  ДополнительныеПараметры - Структура:
//    * ПараметрыПеретаскивания - Массив из СправочникСсылка.Пользователи
//    * Строка - Строка
//    * Перемещение - Булево
//
&НаКлиенте
Процедура ГруппыПользователейПеретаскиваниеЗавершение(Ответ, ДополнительныеПараметры) Экспорт
	
	Если Ответ = КодВозвратаДиалога.Нет Тогда
		Возврат;
	КонецЕсли;
	
	СообщениеПользователю = ПеремещениеПользователяВНовуюГруппу(
		ДополнительныеПараметры.ПараметрыПеретаскивания,
		ДополнительныеПараметры.Строка,
		ДополнительныеПараметры.Перемещение);
	
	Если СообщениеПользователю.Сообщение = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если СообщениеПользователю.ЕстьОшибки = Ложь Тогда
		ПоказатьОповещениеПользователя(
			НСтр("ru = 'Перемещение пользователей'"), , СообщениеПользователю.Сообщение, БиблиотекаКартинок.Информация32);
	Иначе
		ПоказатьПредупреждение(,СообщениеПользователю.Сообщение);
	КонецЕсли;
	
	Оповестить("Запись_ГруппыПользователей");
	
КонецПроцедуры

&НаКлиенте
Процедура ПереключитьОтображениеНедействительныхПользователей(ПоказатьНедействительных)
	
	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
		ПользователиСписок, "Недействителен", Ложь, , ,
		НЕ ПоказатьНедействительных);
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьСодержимоеФормыПриИзмененииГруппы(Форма)
	
	Элементы = Форма.Элементы;
	ГруппаВсеПользователи = ПредопределенноеЗначение(
		"Справочник.ГруппыПользователей.ВсеПользователи");
	Если НЕ ЗначениеЗаполнено(Форма.ТекущийПользователь) Тогда
		Форма.АдресФотографии = Форма.АдресПользовательБезФотографии;
	КонецЕсли;
	
	
	Если НЕ Форма.ХранимыеПараметры.ИспользоватьГруппы
	 ИЛИ Элементы.ГруппыПользователей.ТекущаяСтрока = ГруппаВсеПользователи Тогда
		
		ОбновитьЗначениеПараметраКомпоновкиДанных(Форма.ПользователиСписок,
			"ВсеПользователи", Истина);
		
		ОбновитьЗначениеПараметраКомпоновкиДанных(Форма.ПользователиСписок,
			"ВыбиратьИерархически", Ложь);
		
		ОбновитьЗначениеПараметраКомпоновкиДанных(Форма.ПользователиСписок,
			"ГруппаПользователей", ГруппаВсеПользователи);
	Иначе
		ОбновитьЗначениеПараметраКомпоновкиДанных(Форма.ПользователиСписок,
			"ВсеПользователи", Ложь);
		
		ОбновитьЗначениеПараметраКомпоновкиДанных(Форма.ПользователиСписок,
			"ВыбиратьИерархически", Форма.ВыбиратьИерархически);
		
		ОбновитьЗначениеПараметраКомпоновкиДанных(Форма.ПользователиСписок,
			"ГруппаПользователей", Элементы.ГруппыПользователей.ТекущаяСтрока);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьЗначениеПараметраКомпоновкиДанных(Знач ВладелецПараметров,
                                                    Знач ИмяПараметра,
                                                    Знач ЗначениеПараметра)
	
	Для каждого Параметр Из ВладелецПараметров.Параметры.Элементы Цикл
		Если Строка(Параметр.Параметр) = ИмяПараметра Тогда
			
			Если Параметр.Использование
			   И Параметр.Значение = ЗначениеПараметра Тогда
				Возврат;
			КонецЕсли;
			Прервать;
			
		КонецЕсли;
	КонецЦикла;
	
	ВладелецПараметров.Параметры.УстановитьЗначениеПараметра(ИмяПараметра, ЗначениеПараметра);
	
КонецПроцедуры

&НаСервереБезКонтекста
Процедура СписокПриИзмененииНаСервере()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
		МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный");
		МодульУправлениеДоступомСлужебный.ЗапуститьОбновлениеДоступа();
	КонецЕсли;
	
КонецПроцедуры

// СтандартныеПодсистемы.ПодключаемыеКоманды

&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
	МодульПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Элементы.ПользователиСписок);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
	ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры

&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
	МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды");
	МодульПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Элементы.ПользователиСписок);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	МодульПодключаемыеКомандыКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиентСервер");
	МодульПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Элементы.ПользователиСписок);
КонецПроцедуры

// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

#КонецОбласти